package top.zywork.service;

import top.zywork.dto.GoodsOrderDTO;
import top.zywork.vo.GoodsOrderAndItemInVO;
import top.zywork.vo.GoodsOrderLogisticsVO;
import top.zywork.vo.ResponseStatusVO;
import top.zywork.vo.UserGoodsOrderExVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * GoodsOrderService服务接口<br/>
 *
 * 创建于2019-07-04<br/>
 *
 * @author http://zywork.top 王振宇
 * @version 1.0
 */
public interface GoodsOrderService extends BaseService {

    /**
     * 保存订单和订单项，保存订单项时，可能某个sku会库存不足，需要在save时进行判断，
     * 返回每个sku的id与保存行数的Map，便于前端判断并显示哪个SKU库存不足
     * key为0，对应的是订单id-订单号<br/>
     *
     * 验证订单金额，实付金额，优惠金额，平台优惠金额，店铺优惠金额，赠送积分，运费等数据是否合法
     * @param agentRole 分销商角色，通常是分销等级不同
     * @param goodsOrderAndItemInVOList
     * @return
     */
    Map<Long, String> saveOrders(String agentRole, List<GoodsOrderAndItemInVO> goodsOrderAndItemInVOList);

    /**
     * 取消订单，需要同时更新库存和销量
     * @param userGoodsOrderExVO
     * @return
     */
    int cancelOrder(UserGoodsOrderExVO userGoodsOrderExVO);

    /**
     * 确认收货，需要同时更新库存和销量
     * @param goodsOrderDTO
     * @return
     */
    int confirmOrder(GoodsOrderDTO goodsOrderDTO);

    /**
     * 自动确认订单
     */
    void autoConfirmOrders();

    /**
     * 自动取消订单
     */
    void autoCancelOrders();

    /**
     * 根据订单号获取订单
     * @param orderNo
     * @return
     */
    GoodsOrderDTO getByOrderNo(String orderNo);

    /**
     * 根据多个订单号计数
     * @param orderNos
     * @return
     */
    Long countOrderNos(String[] orderNos);

    /**
     * 根据多个订单号去计算总支付金额
     * @param orderNos
     * @return
     */
    BigDecimal calculateTotalAmount(String[] orderNos);

    /**
     * 订单发货
     * @param id
     * @return
     */
    ResponseStatusVO goodsOrderDelivery(Long id, GoodsOrderLogisticsVO goodsOrderLogisticsVO);

    ResponseStatusVO goodsOrderVerification(Long id);

}
